// 创建一个自己的数组原型

// myArrayPrototype.__proto__ === Array.prototype
export const myArrayPrototype = Object.create(Array.prototype);

const reactiveMethods = ['push', 'pop', 'unshift', 'shift', 'splice', 'reverse', 'sort'];

// 接下就是要去给 myArrayPrototype 添加那些想要重写的变异方法

for (const method of reactiveMethods) {
  Object.defineProperty(myArrayPrototype, method, {
    configurable: true,
    enumerable: false,
    writable: true,
    value: function reactiveMethod(...args) {
      // 先保留原有的功能
      // 原有的数组方法中的this应该是当前数组实例
      // 接到原始方法的返回值
      const originReturnValue = Array.prototype[method].call(this, ...args);

      // 在去做自己的事情
      console.log(`监听到你正在调用数组的 ${method} 方法`);

      // 提取添加的元素
      let inserted = [];

      switch (method) {
        case 'push':
        case 'unshift':
          inserted = args;
          break;
        case 'splice':
          // arr.splice(1, 0, 3, 4) // 从第三个参数开始才是新增的元素
          inserted = args.slice(2);
          break;
      }

      // 给添加的元素做响应式处理
      this.__ob__.observeArray(inserted);

      // 通知侦听了该数组的所有Watcher
      this.__ob__.dep.notify(this, this);

      // 将原始的返回值作为自己方法的返回值
      return originReturnValue;
    }
  });
}
